package config

import (
	"fmt"
	"log"
	"os"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema" // 添加此行以解决 schema.NamingStrategy 导入问题
)

func InitDB() *gorm.DB {
	// 打印数据库配置
	fmt.Println("数据库配置信息:")
	fmt.Printf("DB_USER: %s\n", os.Getenv("DB_USER"))
	fmt.Printf("DB_PASSWORD: %s\n", os.Getenv("DB_PASSWORD"))
	fmt.Printf("DB_HOST: %s\n", os.Getenv("DB_HOST"))
	fmt.Printf("DB_PORT: %s\n", os.Getenv("DB_PORT"))
	fmt.Printf("DB_NAME: %s\n", os.Getenv("DB_NAME"))
	fmt.Printf("DB_CHARSET: %s\n", os.Getenv("DB_CHARSET"))
	fmt.Printf("DB_PARSE_TIME: %s\n", os.Getenv("DB_PARSE_TIME"))
	fmt.Printf("DB_LOC: %s\n", os.Getenv("DB_LOC"))

	// 构建 DSN
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=%t&loc=%s",
		os.Getenv("DB_USER"),
		os.Getenv("DB_PASSWORD"),
		os.Getenv("DB_HOST"),
		os.Getenv("DB_PORT"),
		os.Getenv("DB_NAME"),
		os.Getenv("DB_CHARSET"),
		os.Getenv("DB_PARSE_TIME") == "True", // 注意这里需要转换为布尔类型
		os.Getenv("DB_LOC"),
	)

	// 连接数据库
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true, // ⚠️ 关闭自动复数化 表后面默认加 s
		},
	})
	if err != nil {
		log.Fatalf("GORM Open 失败: %v", err)
	}

	// 获取底层 sql.DB 并 Ping 验证连接
	sqlDB, err := db.DB()
	if err != nil {
		log.Fatalf("获取底层 SQL DB 失败: %v", err)
	}

	if err := sqlDB.Ping(); err != nil {
		log.Fatalf("数据库 Ping 失败: %v", err)
	}

	return db
}
